#-----------------------------------------------------
# instalar librería tidyverse si no está ya instalada
if (!"tidyverse" %in% rownames(installed.packages())) {
  cat("La librería tidyverse se va a instalar...\n")
  install.packages("tidyverse")
} else {
    cat("La librería tidyverse está instalada.\n")
}
## La librería tidyverse está instalada.
if (!"datos" %in% rownames(installed.packages())) {
  cat("La librería datos se va a instalar...\n")
  install.packages("datos")
} else {
    cat("La librería datos está instalada.\n")
}
## La librería datos está instalada.
# cargar la librerías
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(plotly)       # para gráficos interactivos
## 
## Adjuntando el paquete: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout
library(datos)        # conjunto de datos con los que vamos a trabajar
millas
## # A tibble: 234 × 11
##    fabricante modelo     cilindrada  anio cilindros transmision traccion ciudad
##    <chr>      <chr>           <dbl> <int>     <int> <chr>       <chr>     <int>
##  1 audi       a4                1.8  1999         4 auto(l5)    d            18
##  2 audi       a4                1.8  1999         4 manual(m5)  d            21
##  3 audi       a4                2    2008         4 manual(m6)  d            20
##  4 audi       a4                2    2008         4 auto(av)    d            21
##  5 audi       a4                2.8  1999         6 auto(l5)    d            16
##  6 audi       a4                2.8  1999         6 manual(m5)  d            18
##  7 audi       a4                3.1  2008         6 auto(av)    d            18
##  8 audi       a4 quattro        1.8  1999         4 manual(m5)  4            18
##  9 audi       a4 quattro        1.8  1999         4 auto(l5)    4            16
## 10 audi       a4 quattro        2    2008         4 manual(m6)  4            20
## # ℹ 224 more rows
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>
# Lo asignamos a un objeto con el mismo nombre
millas <- millas
help(millas)
## starting httpd help server ... done
## 1. lienzo -----------------------------------
# Crea el lienzo donde se dibujarán los datos
ggplot(data = millas)

## 2. Propiedades estéticas a las variables
# aes en la función ggplot
ggplot(data = millas, aes(x = cilindrada,
                          y = autopista))

## 3. Capa de geometría (puntos)
ggplot(data = millas, aes(x = cilindrada, y = autopista)) +
  geom_point()

## 4. Capa de geometría (puntos)
#     Propiedad color para la variable clase
# aes en capa geom. 
# x    : cilindrada
# y    : autopista
# color: clase
ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, 
                           y = autopista, 
                           color = clase))

## 5. Capa de geometría (puntos)
#     Todos los puntos iguales : color fuera de aes
ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, 
                           y = autopista), 
             color = 'blue')

## 6. Capa de geometría (puntos)
#     Forma de los puntos: shape
# forma específica para todos los puntos
ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, 
                           y = autopista, 
                           color = clase),
             shape = 4)

## 7. Capa de geometría (puntos)
#     Tamaño de los puntos: size
ggplot(data = millas) +
  geom_point(aes(x = cilindrada, 
                 y = autopista, 
                 size = cilindros),
             color = "coral")

# Para ver la gama de colores:
demo("colors")
## 
## 
##  demo(colors)
##  ---- ~~~~~~
## 
## > ### ----------- Show (almost) all named colors ---------------------
## > 
## > ## 1) with traditional 'graphics' package:
## > showCols1 <- function(bg = "gray", cex = 0.75, srt = 30) {
## +     m <- ceiling(sqrt(n <- length(cl <- colors())))
## +     length(cl) <- m*m; cm <- matrix(cl, m)
## +     ##
## +     require("graphics")
## +     op <- par(mar=rep(0,4), ann=FALSE, bg = bg); on.exit(par(op))
## +     plot(1:m,1:m, type="n", axes=FALSE)
## +     text(col(cm), rev(row(cm)), cm,  col = cl, cex=cex, srt=srt)
## + }
## 
## > showCols1()
## 
## > ## 2) with 'grid' package:
## > showCols2 <- function(bg = "grey", cex = 0.75, rot = 30) {
## +     m <- ceiling(sqrt(n <- length(cl <- colors())))
## +     length(cl) <- m*m; cm <- matrix(cl, m)
## +     ##
## +     require("grid")
## +     grid.newpage(); vp <- viewport(width = .92, height = .92)
## +     grid.rect(gp=gpar(fill=bg))
## +     grid.text(cm, x = col(cm)/m, y = rev(row(cm))/m, rot = rot,
## +               vp=vp, gp=gpar(cex = cex, col = cm))
## + }
## 
## > showCols2()
## Cargando paquete requerido: grid

## 
## > showCols2(bg = "gray33")

## 
## > ###
## > 
## > ##' @title Comparing Colors
## > ##' @param col
## > ##' @param nrow
## > ##' @param ncol
## > ##' @param txt.col
## > ##' @return the grid layout, invisibly
## > ##' @author Marius Hofert, originally
## > plotCol <- function(col, nrow=1, ncol=ceiling(length(col) / nrow),
## +                     txt.col="black") {
## +     stopifnot(nrow >= 1, ncol >= 1)
## +     if(length(col) > nrow*ncol)
## +         warning("some colors will not be shown")
## +     require(grid)
## +     grid.newpage()
## +     gl <- grid.layout(nrow, ncol)
## +     pushViewport(viewport(layout=gl))
## +     ic <- 1
## +     for(i in 1:nrow) {
## +         for(j in 1:ncol) {
## +             pushViewport(viewport(layout.pos.row=i, layout.pos.col=j))
## +             grid.rect(gp= gpar(fill=col[ic]))
## +             grid.text(col[ic], gp=gpar(col=txt.col))
## +             upViewport()
## +             ic <- ic+1
## +         }
## +     }
## +     upViewport()
## +     invisible(gl)
## + }
## 
## > ## A Chocolate Bar of colors:
## > plotCol(c("#CC8C3C", paste0("chocolate", 2:4),
## +           paste0("darkorange", c("",1:2)), paste0("darkgoldenrod", 1:2),
## +           "orange", "orange1", "sandybrown", "tan1", "tan2"),
## +         nrow=2)

## 
## > ##' Find close R colors() to a given color {original by Marius Hofert)
## > ##' using Euclidean norm in (HSV / RGB / ...) color space
## > nearRcolor <- function(rgb, cSpace = c("hsv", "rgb255", "Luv", "Lab"),
## +                        dist = switch(cSpace, "hsv" = 0.10, "rgb255" = 30,
## +                        "Luv" = 15, "Lab" = 12))
## + {
## +     if(is.character(rgb)) rgb <- col2rgb(rgb)
## +     stopifnot(length(rgb <- as.vector(rgb)) == 3)
## +     Rcol <- col2rgb(.cc <- colors())
## +     uniqC <- !duplicated(t(Rcol)) # gray9 == grey9 (etc)
## +     Rcol <- Rcol[, uniqC] ; .cc <- .cc[uniqC]
## +     cSpace <- match.arg(cSpace)
## +     convRGB2 <- function(Rgb, to)
## +         t(convertColor(t(Rgb), from="sRGB", to=to, scale.in=255))
## +     ## the transformation,  rgb{0..255} --> cSpace :
## +     TransF <- switch(cSpace,
## +                      "rgb255" = identity,
## +                      "hsv" = rgb2hsv,
## +                      "Luv" = function(RGB) convRGB2(RGB, "Luv"),
## +                      "Lab" = function(RGB) convRGB2(RGB, "Lab"))
## +     d <- sqrt(colSums((TransF(Rcol) - as.vector(TransF(rgb)))^2))
## +     iS <- sort.list(d[near <- d <= dist])# sorted: closest first
## +     setNames(.cc[near][iS], format(zapsmall(d[near][iS]), digits=3))
## + }
## 
## > nearRcolor(col2rgb("tan2"), "rgb")
##          0.0         21.1         25.8         29.5 
##       "tan2"       "tan1" "sandybrown"    "sienna1" 
## 
## > nearRcolor(col2rgb("tan2"), "hsv")
##       0.0000       0.0410       0.0618       0.0638       0.0667       0.0766 
##       "tan2"    "sienna2"     "coral2"    "tomato2"       "tan1"      "coral" 
##       0.0778       0.0900       0.0912       0.0918 
##    "sienna1" "sandybrown"     "coral1"     "tomato" 
## 
## > nearRcolor(col2rgb("tan2"), "Luv")
##         0.00         7.42         7.48        12.41        13.69 
##       "tan2"       "tan1" "sandybrown"    "orange3"    "orange2" 
## 
## > nearRcolor(col2rgb("tan2"), "Lab")
##         0.00         5.56         8.08        11.31 
##       "tan2"       "tan1" "sandybrown"       "peru" 
## 
## > nearRcolor("#334455")
##          0.0867 
## "darkslategray" 
## 
## > ## Now, consider choosing a color by looking in the
## > ## neighborhood of one you know :
## > 
## > plotCol(nearRcolor("deepskyblue", "rgb", dist=50))

## 
## > plotCol(nearRcolor("deepskyblue", dist=.1))

## 
## > plotCol(nearRcolor("tomato", "rgb", dist= 50), nrow=3)

## 
## > plotCol(nearRcolor("tomato", "hsv", dist=.12), nrow=3)

## 
## > plotCol(nearRcolor("tomato", "Luv", dist= 25), nrow=3)

## 
## > plotCol(nearRcolor("tomato", "Lab", dist= 18), nrow=3)

## 8. Capa labs (títulos y etiquetas)
#     
g <-ggplot(millas, aes(x = cilindrada, 
                       y = ciudad, 
                       color = clase)) +
  geom_point() +
  labs(
    title = "Relación entre cilindrada y Consumo en ciudad",
    subtitle = "Consumo de combustible de varios modelos de autos",
    x = "Cilindrada del Motor",
    y = "Recorrido en ciudad (millas por galón)",
    color = "Tipo de Vehículo",
    caption = "Fuente: Dataset millas"
  )
g

p <-ggplotly(g)
p
htmlwidgets::saveWidget(p, "grafico_interactivo.html", selfcontained = TRUE)
## 8. Capa facets 
#     facet_wrap() : Crea una matriz de subgráficos para una única variable categórica
#                    de facetado. 
#                    Cada valor de la variable tiene su propio subgráfico.
# Gráfico de dispersión con facetas  para cada clase de vehículo
ggplot(millas, aes(x = cilindrada, y = ciudad)) +
  geom_point() +
  facet_wrap(~ traccion) +
  labs(
    title = "Relación entre Cilindrada y Consumo en Ciudad",
    x = "Cilindrada",
    y = "Consumo en Ciudad (millas por galón)"
  )

## 9. Capa facets 
#     facet_grid() : Crea una cuadrícula de subgráficos basados en una o dos variables
#                    de facetado
# Gráfico de dispersión con facetas para combinaciones de combustible  y tracción
ggplot(millas, aes(x = cilindrada, y = ciudad, color = clase)) +
  geom_point() +
  facet_grid(combustible ~ traccion) 

## 10. Capa Themes : estilo de gráfico: colores, líneas y bordes, títulos, fondo, ...
#
ggplot(millas, aes(x = cilindrada, y = ciudad, color = clase)) +
  geom_point() +
  facet_grid(combustible ~ traccion) +
  theme_bw()

ggplot(millas, aes(x = clase, y = ciudad)) +
  geom_point() +
  labs(
    title = "Relación clase - eficiencia en ciudad",
    x = "Clase de vehículo",
    y = "eficiencia en ciudad"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 18, face = "bold", color = "blue"),  # Título más grande y en negrita
    axis.title.y = element_text(size = 20),
    axis.title.x = element_text(size = 10),  # # Tamaño del texto de los ejes
    axis.text = element_text(color = "red"),  # Color rojo para los números de los ejes
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.background = element_rect(fill = "white"),  # Fondo blanco en el panel
    plot.background = element_rect(fill = "lightyellow")  # Fondo amarillo claro para todo el gráfico
  )

## TIPOS DE GRÁFICOS
## 1. BARRAS (VARIABLE DISCRETA)
# eje y se muestra el recuento (count)
ggplot(data=millas)+
  geom_bar(mapping=aes(x=clase), 
          # stat = "count"              # estadística por defecto
           )

# eje y se muestra una proporción
ggplot(data = millas) +
  geom_bar(mapping = aes(x = clase, 
                         y = after_stat(prop), 
                         group = 1))

## 2. BARRAS (VARIABLE DISCRETA) - Propiedad : fill para el color de relleno
ggplot(data=millas)+
  geom_bar(mapping=aes(x=traccion, fill = clase) )

## 3. BARRAS (VARIABLE DISCRETA) - Propiedad : fill para el color de relleno
# Posición de las barras
ggplot(data=millas)+
  geom_bar(mapping=aes(x=traccion, fill = clase),
           position = 'dodge')

ggplot(data=millas)+
  geom_bar(mapping=aes(x=traccion, fill = clase),
           color = 'black',
           position = 'dodge')

## 4. HISTOGRAMA (VARIABLE CONTINUA) 
ggplot(data=millas)+
  geom_histogram(mapping=aes(x=autopista) ) +
  labs(title = "Distribución de Autonomía en autopista",
       x = "Autonomía en Carretera (mpg)",
       y = "Frecuencia") 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## 5. HISTOGRAMA (VARIABLE CONTINUA)  - Propiedad fill: para diferenciar por una varaible
# millas recorridas por litro de combustible en autopista 
ggplot(data=millas)+
  geom_histogram(mapping=aes(x=autopista, fill = traccion)) +
  labs(title = "Distribución de Autonomía en autopista",
       x = "Millas recorridas por litro en autopista",
       y = "Frecuencia") 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## 6. DENSIDAD (VARIABLE CONTINUA)  - Propiedad fill: para diferenciar por una variable
# El eje y representa la densidad en lugar de los conteos. 
# Si sumas el área de todas las barras, dará 1.
ggplot(data = millas, aes(x = autopista)) +
  geom_histogram(aes(y = after_stat(density)))+
  geom_density( alpha = 0.5,
               fill = 'red') +
  labs(title = "Distribución de Densidad de Autonomía en autopista",
       x = "Millas recorridas por litro en autopista",
       y = "Densidad") 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

## 7. DENSIDAD (VARIABLE CONTINUA)  - Propiedad fill: para diferenciar por una variable
ggplot(data = millas) +
  geom_density(aes(x = autopista, fill = traccion),
               alpha = 0.7) +
  labs(title = "Distribución de Densidad de Autonomía en autopista",
       x = "Millas recorridas por litro en autopista",
       y = "Densidad") 

## 8. Scatter Plot - Diagramas de dispersión
ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, 
                           y = autopista, 
                           color = clase))

ggplot(data = millas) +
  geom_point(aes(x = ciudad, y = autopista, color = traccion),
             alpha = 0.7) +
  labs(title = "Relación entre Millas por Galón en Ciudad y autopista",
       x = "Millas por Galón en Ciudad",
       y = "Millas por Galón en autopista",
       color = "Tracción")

## 9. Líneas de tendencia
# geom_smooth() se utiliza para agregar líneas de tendencia
# o curvas de suavizado 
ggplot(data=millas)+
  geom_point(mapping=aes(x=ciudad, y=cilindrada), color="Blue") +
  geom_smooth(mapping=aes(x=ciudad, y=cilindrada), color="Red") +
  labs(title = "Relación entre consumo en Ciudad y \ncilindrada con Línea de Tendencia",
       x = "Millas por Galón en Ciudad",
       y = "Cilindrada del motor")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

## 10. Líneas de tendencia
# geom_smooth() se utiliza para agregar líneas de tendencia o curvas de suavizado 
#
# loess(suavizado local): Para una relación no lineal. 
# LOESS realiza ajustes en segmentos locales de los datos, 
# lo que permite capturar patrones no lineales.
# lm (regresión lineal): Para una relación lineal
ggplot(data=millas)+
  geom_point(mapping=aes(x=ciudad, y=cilindrada), color="Blue") +
  geom_smooth(mapping=aes(x=ciudad, y=cilindrada),
              method = 'lm',
              color="Red") +
  labs(title = "Relación entre consumo en Ciudad y \ncilindrada con Línea de Tendencia",
       x = "Millas por Galón en Ciudad",
       y = "Cilindrada del motor")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(data=millas)+
  geom_point(mapping=aes(x=ciudad, y=cilindrada), color="Blue") +
  geom_smooth(mapping=aes(x=ciudad, y=cilindrada),
              level = 0.95,   # nivel de confianza
              color="Red")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

## 11. BARRAS - Una variable discreta y una continua
# calculo la media de millas recorridas en ciudad 
# por clase de vehículo
eficiencia <- millas %>%
  group_by(clase) %>% 
  summarise(recorrido_medio = mean(ciudad))
eficiencia
## # A tibble: 7 × 2
##   clase       recorrido_medio
##   <chr>                 <dbl>
## 1 2asientos              15.4
## 2 compacto               20.1
## 3 mediano                18.8
## 4 minivan                15.8
## 5 pickup                 13  
## 6 subcompacto            20.4
## 7 suv                    13.5
ggplot(data = eficiencia) +
  geom_col(aes(x = clase, y = recorrido_medio),
          fill = "skyblue", 
          color = "black") +
  labs(title = "Recorrido Promedio por clase de vehículo",
       x = "Clase de vehículo",
       y = "Recorrido Promedio (Millas)")

## 12. BARRAS Y ETIQUETAS
ggplot(data = eficiencia) +
  geom_col(aes(x = clase, 
               y = recorrido_medio),
           fill = "skyblue", color = "black") +
  geom_text(aes(x = clase, 
                y = recorrido_medio,
                label = round(recorrido_medio, 2)), vjust = 1.5
            ) +
  labs(title = "Recorrido Promedio por clase de vehículo",
       x = "Clase de vehículo",
       y = "Recorrido Promedio (Millas)")

## 13. CAJAS Y BIGOTES - Una variable continua
# Diagrama de cajas y bigotes para la variable continua ciudad
ggplot(data = millas) +
  geom_boxplot(aes(x = ciudad), 
               color = "black", outlier.colour = "red") 

# Diagrama de cajas y bigotes para la variable continua ciudad
# por clase de vehículo
ggplot(data = millas) +
  geom_boxplot(aes(x = clase, 
                   y = ciudad), 
               outlier.colour = "red") 

g <- ggplot(data = millas) +
        geom_point(aes(x = cilindrada, 
                       y = autopista, 
                       color = clase))
p <-ggplotly(g)
#htmlwidgets::saveWidget(p, "grafico_interactivo.html", selfcontained = TRUE)
show(p)